<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>each循环的完整封装</title>
</head>
<body>

<script>

   //判断一个对象是数组还是伪数组
//   function isArrayLike(obj){
   //       if(Object.prototype.toString.call(obj)==='[object Array]'){
   //           return true;
   //       }
   //       var length = 'length' in obj && obj.length;
   //       return typeof length ==='number'&&length>=0;
   //   }
   //
   //    function each(arr,callback){
   //        //把变量名提升在前面，避免在变量名提升的时候造成一些错误
   //        var i,k;
   //        if(isArrayLike(arr)){
   //            for( i=0;i<arr.length;i++){
   //                if(callback.call(arr[i],arr[i],i)===false)
   //                    break;
   //            }
   //        }else{
   //            for( k in arr){
   //                if(callback.call(arr[k],arr[k],k)===false)
   //                    break;
   //            }
   //        }
   //        return arr;
   //    }
   //
   //   //数组调用
   //   var arr = ['a','f','d'];
   //   var obj = {
   //       name :'cgq',
   //       gender:'女'
   //   };
   //    each(arr,function(v,i){
   //        console.log(this);
   //        console.log(v + ',' +i );
   //
   //        return false;
   //    });

   //判断是否是数组
   function isArrayLike(obj){
       if(Object.prototype.toString.call(obj)==='[object,Array]'){
           return true;
       }
       var length = 'length' in obj && obj.length;
       return typeof length ==='number' && length>=0;
   }

    function each(arr,callback){

        if(isArrayLike(arr)){
            for(var i=0;i<arr.length;i++){
                if(callback.call(arr[i],arr[i],i)===false)
                return;
            }
        }else{
            for(var k in arr){
                if(callback.call(arr[k],arr[k],k)===false)
                return;
            }
        }
    }
    var obj = {
        name:'cgq',
        age:"fs"
    }
   var arr = ['d','f','g'];
    each(arr,function(v,i){
        console.log(v + ',' + i);
    })
</script>
</body>
</html>